#ifndef __FP_TASK_H__
#define __FP_TASK_H__
#include "btl_config.h"

#define DUPLICATE_MIN_DISTANCE       (20)
#define MAX_CHECK_REDUNDANCY_AGAINST (8)

#define TASK_ID_IDLE 0x00
#define TASK_ID_WFD  0x01 /* Wait finger detection */
#define TASK_ID_TFD  0x02 /* Trigger finger detection */

#define FP_TASK_EV_ENROLL 0x01
#define FP_TASK_EV_VERIFY 0x02
#define FP_TASK_EV_OTHER  0x03

#define DO_ENROLL_TIMEOUT (10 * 1000) /* 10s 超时 */
#define DO_REMOVE_TIMEOUT (5 * 1000)  /* 5s 超时 */

void do_enroll(void);
void do_verify(void);
void do_idle(void);
void do_capture(void);
void do_detect(void);
void do_Identifyremove(void);
void do_checkfingeroff(void);
void do_detect1(void);

typedef struct bfxx_fingerprint_task_block {
    uint8_t task_id;
    uint8_t task_ev; /* task enroll or verify flag */
    uint8_t task_fd; /* finger detection info */
    uint8_t extinfo;
    uint16_t task_time; /* finger detection time */
    uint32_t task_begin; /* 任务开始 */
    uint32_t timeout;   /* 任务超时 */
    void (*run)(void);
} fp_task_t;

fp_task_t* fp_task(void);

#define OBTAIN_FP_TASK(task, k) ((task)->(k))
#define SET_FP_TASK(task, k, v) ((task)->k = v)
#define IS_FP_TASK(task, k, v)  ((task)->k == (v))

void task_run(uint8_t task_id, void (*run)(void));
void task_tfd(void);
void task_next(void);
void task_default(void);

int is_task_timeout(void);
void update_task_timeout(void);

void fp_do_capture(void);
void fp_do_enroll(void);
void fp_do_verify(void);
void fp_do_detect(void);
void fp_do_detect1(void);
void fp_do_idle(void);

void fp_do_Identifyremove(void);
void fp_do_remove(uint16_t index, int cmd1);

#endif /* __FP_TASK_H__ */
